/*
 * BehandlungMapper.java
 * 
 *  author: Daniel Rudigier
 *    date: 05.06.2008
 * 
 * 
 */
package ocumed.persistenz.mapper;

import java.util.Calendar;
import java.util.List;
import java.util.Set;

import ocumed.persistenz.dao.BehandlungDAO;
import ocumed.persistenz.dao.BenutzerDAO;
import ocumed.persistenz.dao.DAOFactory;
import ocumed.persistenz.dao.PatientDAO;
import ocumed.persistenz.hibernate.OcBehandlung;
import ocumed.persistenz.hibernate.OcBenutzer;
import ocumed.persistenz.hibernate.OcPatient;
import ocumed.teams.IBehandlung;
import ocumed.teams.IPosition;

/**
 * @author Daniel Rudigier
 *
 */
public class BehandlungMapper extends PersistenceMapper {
    /**
     * override
     *
     * @see ocumed.persistenz.mapper.PersistenceMapper#delete(java.lang.Object)
     */
    @Override
    public void delete(Object instance) {
        BehandlungDAO bDAO = DAOFactory.get(DAOFactory.RDBMS).getBehandlungDAO();
        bDAO.start();

        IBehandlung i = (IBehandlung) instance;
        OcBehandlung r = bDAO.findById(i.getBehandlungid());

        bDAO.delete(r);
        bDAO.commit();
    }

    /**
     * override
     *
     * @see ocumed.persistenz.mapper.PersistenceMapper#get(int)
     */
    @Override
    public Object get(int id) {
//        BehandlungDAO bDAO = DAOFactory.get(DAOFactory.ORACLE).getBehandlungDAO();
//        bDAO.start();
//        return bDAO.findById(id);
        throw new UnsupportedOperationException();
    }

    /**
     * override
     *
     * @see ocumed.persistenz.mapper.PersistenceMapper#getAll()
     */
    @Override
    public List getAll() {
//        BehandlungDAO bDAO = DAOFactory.get(DAOFactory.ORACLE).getBehandlungDAO();
//        bDAO.start();
//        return bDAO.findAll();
        throw new UnsupportedOperationException();
    }

    /**
     * override
     *
     * @see ocumed.persistenz.mapper.PersistenceMapper#put(java.lang.Object)
     */
    @Override
    public void put(Object instance) {
        BehandlungDAO bDAO = DAOFactory.get(DAOFactory.RDBMS).getBehandlungDAO();
        bDAO.start();
        
        IBehandlung i = (IBehandlung) instance;
        OcBehandlung r = bDAO.findById(i.getBehandlungid());

        if (r != null) {
            updateBehandlung(r, i);
            bDAO.attachDirty(r);
        } else {
            r = new OcBehandlung();
            updateBehandlung(r, i);
            Integer id = bDAO.persist(r);
            i.setBehandlungid(id);
        }
        
        bDAO.commit();
        updateReferences(i);
    }

    /**
     * @param r
     * @param i
     */
    private void updateBehandlung(OcBehandlung r, IBehandlung i) {
        PatientDAO pDAO = DAOFactory.get(DAOFactory.RDBMS).getPatientDAO();
        BenutzerDAO uDAO = DAOFactory.get(DAOFactory.RDBMS).getBenutzerDAO();
        pDAO.start();
        uDAO.start();
        
        OcPatient p = i.getiPatient() != null ? pDAO.findById(i.getiPatient().getPatientid()) : null; 
        OcBenutzer u = i.getiArzt() != null ? uDAO.findById(i.getiArzt().getBenutzerid()) : null;
        
        r.setBehandlungid(i.getBehandlungid());
        r.setOcPatient(p);
        r.setOcBenutzer(u);
        Calendar c1 = Calendar.getInstance();
        c1.setTime(i.getBehandlungvon());
        r.setBehandlungvon(c1);
        Calendar c2 = Calendar.getInstance();
        c2.setTime(i.getBehandlungbis());
        r.setBehandlungbis(c2);
        r.setBehandlungdiagnose(i.getBehandlungdiagnose());
        r.setBehandlungmitterminvermerk(i.getBehandlungmitterminvermerk());
        r.setBehandlungmitueberweisung(i.getBehandlungmitueberweisung());
        r.setBehandlungmitverschein(i.getBehandlungmitverschein());
        r.setBehandlungstatus(i.getBehandlungstatus());
    }
    
    
    private void updateReferences(IBehandlung i) {
    	PersistenceHandler ph = new PersistenceHandler();
    	
        for(IPosition ip : i.getiPositions()) {
        	ph.put(ip);
        }
    }
}
